package editorsvg.svg.parser;

import editorsvg.editor.tipos.Colores;

/**
 *
 * @author Jorge Berjaano
 */
public class ColorParser {
    private ColorHandle colorHandle;
        
    private static final String MATCH_NAME = 
            "[a-z]+";
    private static final String MATCH_RGB_DECIMAL =
            "rgb\\s*\\((\\s*[0-9]+\\s*,){2}\\s*[0-9]+\\s*\\)";
    private static final String SPLIT_RGB_DECIMAL =
            "rbg\\s*\\(\\s*|\\s*,\\s*|s*\\)";
    private static final String MATCH_RGB_PORCENTAJE =
            "rgb\\s*\\((\\s*[0-9]+\\s*%\\s*,){2}\\s*[0-9]+\\s*%\\s*\\)";
    private static final String SPLIT_RGB_PORCENTAJE =
            "rgb\\s*\\(\\s*|\\s*%\\s*,\\s*|\\s*%\\s*\\)";
    private static final String MATCH_RGB_HEX3 =
            "#[\\da-f]{3}";
    private static final String MATCH_RGB_HEX6 =
            "#[\\da-f]{6}";    
    private static final String SPLIT_RGB_HEX = "#";
    
    private static final String MATCH_ID =
            "url\\s*\\(\\s*#[a-z][a-z0-9]+\\s*\\)";
    private static final String SPLIT_ID =
            "url\\s*\\(\\s*#|\\s*\\)";
    
    private static final String MATCH_NONE = "\\s*none\\s*";
          
    
    public void setColorHandler(ColorHandle colorHandle) {
        this.colorHandle = colorHandle;
    }

    public void parsearColor(String texto) {
        if (texto == null) {
            colorHandle.invalid(null);
        }
        
        if (colorHandle == null) {
            return;
        }
        texto = texto.toLowerCase().trim();
        
        if (texto.isEmpty()) {
            return;
        } else if (texto.equals("none")) {
            colorHandle.none();
            return;
        }
        
        Integer rgb = null;
        
        if (texto.matches(MATCH_NAME)) {

            rgb = Colores.obtenerRgb(texto);
            if (rgb == null) {
                System.err.println("Error al parsear color rgb decimal: " + texto);
                colorHandle.invalid(texto);
            }
        } else if (texto.matches(MATCH_RGB_DECIMAL)) {
            String[] valores = texto.split(SPLIT_RGB_DECIMAL);
            if (valores.length >= 4) {
                rgb = 0;
                for (int i = 1; i < 4; i++) {
                    int valor = parsearEntero(valores[i], 10);
                    rgb += valor << ((3 - i) * 8);
                }                
            } else {
                System.err.println("Error al parsear color rgb decimal: " + texto);
            }
        } else if (texto.matches(MATCH_RGB_PORCENTAJE)) {
            String[] valores = texto.split(SPLIT_RGB_PORCENTAJE);
            if (valores.length >= 4) {
                int byte1 = parsearEntero(valores[1], 10) * 255 / 100;
                int byte2 = parsearEntero(valores[2], 10) * 255 / 100;
                int byte3 = parsearEntero(valores[3], 10) * 255 / 100;
                rgb = byte1 * 256 * 256 + byte2 * 256 + byte3;
            } else {
                System.err.println("Error al parsear color rgb porcentaje: "  + texto);
            }
        } else if (texto.matches(MATCH_RGB_HEX3)) {
            String[] valores = texto.split(SPLIT_RGB_HEX);
            if (valores.length >= 2 && valores[1].length() == 3) {
                String ch1 = valores[1].substring(0, 1);
                String ch2 = valores[1].substring(1, 2);
                String ch3 = valores[1].substring(2, 3);
                int byte1 = parsearEntero(ch1 + ch1, 16);
                int byte2 = parsearEntero(ch2 + ch2, 16);
                int byte3 = parsearEntero(ch3 + ch3, 16);
                rgb = byte1 * 256 * 256 + byte2 * 256 + byte3;
            } else {
                System.err.println("Error al parsear color rgb hexadecimal(3): "  + texto);
            }
            
        } else if (texto.matches(MATCH_RGB_HEX6)) {
            String[] valores = texto.split(SPLIT_RGB_HEX);
            if (valores.length >= 2 && valores[1].length() == 6) {
                int byte1 = parsearEntero(valores[1].substring(0, 2), 16);
                int byte2 = parsearEntero(valores[1].substring(2, 4), 16);
                int byte3 = parsearEntero(valores[1].substring(4, 6), 16);
                rgb = byte1 * 256 * 256 + byte2 * 256 + byte3;
            } else {
                System.err.println("Error al parsear color rgb hexadecimal(6): " + texto);
            }
        }
        if (rgb != null) {
            colorHandle.color(rgb);
            return;
        }
        
        if (texto.matches(MATCH_ID)) {
            String[] fragmentos = texto.split(SPLIT_ID);
            if (fragmentos.length >= 2) {
                colorHandle.id(fragmentos[1]);
                return;
            } else {
                System.err.println("Error al parsear color id: " + texto);
            }                
        }
        
        if (texto.matches(MATCH_NONE)) {
            colorHandle.none();
            return;
        }
        
        colorHandle.invalid(texto);        
    }

    private static int parsearEntero(String texto, int base) {
        int valor = 0;
        try {
            valor = Integer.parseInt(texto, base);
        } catch (NumberFormatException ex) {
        }
        return valor;
    
    }
}
